﻿/******************************************************************************
* File description: ChromatogramManager.h
* Function: 提供能谱图功能管理
* Current Version: 1.0.0
* Author: JNN
* Date: 2025-07-01
*  -----
*  Copyright by 博坤生物 .
 *****************************************************************************/


#pragma once

#include <QTimer>
#include "chromatogramChart.h"
#include "algorithm.h"
#include "GetMessageInterface.h"


class ChromatogramManager : public QObject{

    Q_OBJECT

public:
    ChromatogramManager();

    Q_INVOKABLE void onStartExperiment();
    Q_INVOKABLE void onEndExperiment();

//    Q_INVOKABLE void setDetectMode(int isAuto, int autoType, int thr, int delayTimeCollect, int timeCollect, int delayTimeStop);
//    Q_INVOKABLE void setDetectMode(int isAuto);
//    Q_INVOKABLE void setThreshold(int thr);
//    Q_INVOKABLE QVariantMap getDetectMode();

    Q_INVOKABLE void clearChart();      // 只清空图表，不清数据

    Q_INVOKABLE void clearData();       // 包含清除数据和清除图表

    Q_INVOKABLE double getYByX(double x);       // 获取某一个x所在的y值(主要用于那个鼠标交互)

    Q_INVOKABLE void appendNewPoint(double value);      // 用于接收更新数据的信号，由前端调用

    // 和外部内容的接口
    ChromatogramChart*      _chart = nullptr;
    GetMessageInterface     *_msgInterface = nullptr;



signals:
    void sigStartCollect();
    void sigEndCollect();

public slots:

//    void refresh();         // 秒间隔触发，执行计算
//    void onCollectStop();

    void tickOneSecond();


private:

//    void refreshPointList();

//    void judgeCollectState();
//    bool judgeCollectStateByThr();
//    bool judgeCollectStateByPeak();
//    bool judgeCollectCloseStateByThr();



public:
    // 模式
//    int  _isAuto = 0;               // 0自动 1手动
//    int  _autoType = 0;             // 0阈值+指定收集时间 1峰值+指定收集时间 2阈值+低于阈值时停止收集
//    int  _threshold = 300;          // 阈值在开启实验之后就不能手动调了吧……
//    int  _delayTimeCollect = 1;     // 开始延迟时间(s)
//    int  _timeCollect = 120;        // 产物接收时间(s)
//    int  _delayTimeStop = 0;        // 关闭检测延迟时间(s)

    double              _initMaxX = 300;       // 无数据时x轴的位置


    // 数据
    QVector<QPointF>    _pointList_raw;
    QVector<QPointF>    _pointList_filter;      // 1. 做滤波  2. 对过早的数据删点
    QVector<QPointF>    _pointList_simp;


    QTimer*      _timer_tick;           // 一秒触发一次
//    QTimer*      _timer_collect;        // 统计收集的时间

    QVector<double>     _cpsDataList;   // 缓存下位机发的数据


//    // 临时数据
//    bool        _hasRise = false;
//    bool        _hasCollect = false;

    Q_INVOKABLE void opennpwh();
    Q_INVOKABLE void closenpwh();
};
